﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Net.Chirash.Twitter.TwitterDatabase;

namespace Net.Chirash.Twitter.TweetZone.WindowComponents
{
	/// <summary>
	/// NotificationWindow.xaml の相互作用ロジック
	/// </summary>
	public partial class NotificationWindow : Window
	{
		/*
		 * NotificationDurationと
		 * UserDefinedOpacityが
		 * Properties.Settingsを利用するようにする
		 */

		public NotificationWindow()
		{
			InitializeComponent();


			//DEBUG
			NotificationDuration = 3.0;
			UserDefinedOpacity = 1.0;

			ShowStoryboard = (Storyboard)FindResource("ShowStoryboard");
			HideStoryboard = (Storyboard)FindResource("HideStoryboard");
		}

		Storyboard ShowStoryboard, HideStoryboard;

		#region Properties
		/// <summary>
		/// 表示される期間、デフォルトは3秒
		/// </summary>
		public double NotificationDuration { get; set; }

		//MEMO:動的に変えられるようにするかも?
		/// <summary>
		/// ###未実装です###
		/// 表示されたときの透明度を表示します
		/// 値は0.0~1.0です
		/// </summary>
		public double UserDefinedOpacity { get; set; }

		/// <summary>
		/// このNotificationWindowをどこに表示するかを表します
		/// </summary>
		public NotificationArea Area { get; set; }
		#endregion

		#region Private Fields
		/// <summary>
		/// Areaに応じて変更
		/// ShowStoryboard,HideStoryboardによって使用されます
		/// 値はY軸の値です
		/// </summary>
		private double HidedLocation { get; set; }
		#endregion

		#region Private Methods

		/// <summary>
		/// Notifyを呼び、Contentsが設定し終わったら呼ぶこと。 
		/// </summary>
		private void Adjust()
		{
			if (Area == null)
				Area = NotificationArea.BottomRight;
			switch (Area)
			{
				case NotificationArea.TopRight:
					Top = 0;
					Left = SystemParameters.WorkArea.Width - ActualWidth;
					break;
				case NotificationArea.TopLeft:
					Top = 0;
					Left = 0;
					break;
				case NotificationArea.BottomRight:
					Top = SystemParameters.WorkArea.Height - ActualHeight;
					Left = SystemParameters.WorkArea.Width - ActualWidth;
					break;
				case NotificationArea.BottomLeft:
					Top = SystemParameters.WorkArea.Height - ActualHeight;
					Left = 0;
					break;
				default:
					break;
			}


		}

		#endregion


		#region enums
		public enum IconType
		{
			Error,
			Information,
			None
		}

		public enum NotificationArea
		{
			TopRight,
			TopLeft,
			BottomRight,
			BottomLeft
		}


		#endregion

		#region Behavior Control

		private void StartNotifying()
		{
			System.Timers.Timer t = new System.Timers.Timer(NotificationDuration) { AutoReset = false };
			t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
			Dispatcher.BeginInvoke((Action)delegate()
			{
				ShowStoryboard.Begin();
			}, null);
		}

		void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
		{
			Dispatcher.BeginInvoke((Action)delegate()
			{
				HideStoryboard.Begin();
			}, null);
		}
		#endregion

		#region Notify Methods
		/// <summary>
		/// 指定されたStatusBox UserControlを表示します
		/// </summary>
		/// <param name="content">表示するUserControl</param>
		public void Notify(List<StatusBox> content)
		{
			if (MainContents.Children != null)
				MainContents.Children.Clear();

			foreach (var cur in content)
			{
				MainContents.Children.Add(cur);
			}

			Adjust();
			StartNotifying();
		}

		/// <summary>
		/// ###未実装です###
		/// StatusBoxを時間を指定して表示します
		/// </summary>
		/// <param name="content"></param>
		/// <param name="duration"></param>
		private void Notify(List<StatusBox> content, double duration)
		{

		}

		/// <summary>
		/// ###未実装です###
		///指定されたStatusを表示します
		/// </summary>
		/// <param name="content"></param>
		private /*現状、独自の表示形式を実装する予定がありません*/
			void Notify(List<Status> content)
		{

		}

		/// <summary>
		/// ###未実装です###
		/// 単純に文字列を通知します
		/// </summary>
		/// <param name="message">表示する文字列</param>
		private void Notify(string message)
		{
			throw new NotImplementedException("未実装です");
		}

		/// <summary>
		/// ###未実装です###
		///通知を、文字列とアイコンで通知します 
		/// </summary>
		/// <param name="message">通知する文字列</param>
		/// <param name="icon">表示するアイコン</param>
		private void Notify(string message, IconType icon)
		{
			throw new NotImplementedException("未実装です");
		}

		/// <summary>
		/// ###未実装です###
		/// 文字列と任意の画像を表示します
		/// </summary>
		/// <param name="message">通知する文字列</param>
		/// <param name="source">表示する画像</param>
		private void Notify(string message, ImageSource source)
		{
			throw new NotImplementedException("未実装です");


		}
		#endregion



	}

}
